home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Amiga Tools 2
/
Amiga Tools 2.iso
/
tools
/
jade
/
lisp
/
debug.jl
< prev
next >
Wrap
Lisp/Scheme
|
1995-03-09
|
4KB
|
124 lines
;;;; debug.jl -- Lisp debugger (well, single-stepper anyway)
;;; Copyright (C) 1993, 1994 John Harper <jsh@ukc.ac.uk>
;;; This file is part of Jade.
;;; Jade is free software; you can redistribute it and/or modify it
;;; under the terms of the GNU General Public License as published by
;;; the Free Software Foundation; either version 2, or (at your option)
;;; any later version.
;;; Jade is distributed in the hope that it will be useful, but
;;; WITHOUT ANY WARRANTY; without even the implied warranty of
;;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
;;; GNU General Public License for more details.
;;; You should have received a copy of the GNU General Public License
;;; along with Jade; see the file COPYING. If not, write to
;;; the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA.
(provide 'debug)
(defvar debug-buffer (make-buffer "*debugger*")
"Buffer to use for the Lisp debugger.")
(set-buffer-special debug-buffer t)
(add-buffer debug-buffer)
(defvar debug-ctrl-c-keymap (make-keylist)
"Keymap for debugger's ctrl-c prefix.")
(bind-keys debug-ctrl-c-keymap
"Ctrl-s" 'debug-step
"Ctrl-i" '(debug-set-result nil)
"Ctrl-n" 'debug-next
"Ctrl-c" 'debug-continue
"Ctrl-r" 'debug-continue
"Ctrl-b" '(debug-backtrace 2)
"Ctrl-x" 'debug-set-result)
(defun debug-mode ()
"Debug Mode:\n
The major mode controlling the Lisp debugger. Commands available within
the debugger are,\n
`Ctrl-c Ctrl-s' Step into this form.
`Ctrl-c Ctrl-i' Ignore this form.
`Ctrl-c Ctrl-n' Continue until the next form.
`Ctrl-c Ctrl-r' Continue execution.
`Ctrl-c Ctrl-b' Print a backtrace of the Lisp call stack.
`Ctrl-c Ctrl-x' Set the value which this form will return."
(setq ctrl-c-keymap debug-ctrl-c-keymap
major-mode 'debug-mode
mode-name "Debug"))
(with-buffer debug-buffer
(debug-mode)
(split-line)
(insert "::Lisp Debugger::\n
Ctrl-c Ctrl-s : Step into form
Ctrl-c Ctrl-i : Ignore form
Ctrl-c Ctrl-n : Continue until next form
Ctrl-c Ctrl-r : Continue
Ctrl-c Ctrl-b : Print backtrace
Ctrl-c Ctrl-x : Set value of form\n\n"))
;;;###autoload
(defun debug-entry (debug-obj debug-depth)
(with-buffer debug-buffer
(goto-char (line-start (buffer-end)))
(format debug-buffer "%s%S\n" (make-string (* 2 debug-depth)) debug-obj)
(goto-glyph (next-line 1 (indent-pos (prev-line))))
(catch 'debug
(recursive-edit))))
(defun debug-exit (debug-val debug-depth)
(with-buffer debug-buffer
(goto-char (line-start (buffer-end)))
(format debug-buffer "%s=> %S\n" (make-string (* 2 debug-depth)) debug-val)))
;;;###autoload
(defun debug-error-entry (error-list)
(with-buffer debug-buffer
(goto-char (line-start (buffer-end)))
(format debug-buffer "*** Error: %s: %S\n" (unless (get (car error-list) 'error-message) (car error-list)) (cdr error-list))
(catch 'debug
(recursive-edit)
nil)))
(defun debug-step ()
(interactive)
(if (boundp 'debug-obj)
(throw 'debug (cons 1 debug-obj))
(beep)))
(defun debug-set-result (value)
(interactive "XEval:")
(if (boundp 'debug-obj)
(throw 'debug (cons 4 value))
(beep)))
(defun debug-next ()
(interactive)
(if (boundp 'debug-obj)
(throw 'debug (cons 2 debug-obj))
(beep)))
(defun debug-continue ()
(interactive)
(cond
((boundp 'debug-obj)
(throw 'debug (cons 3 debug-obj)))
((boundp 'error-list)
(throw 'debug))
(t
(beep))))
;; DEPTH is the number of stack frames to discard
(defun debug-backtrace (depth)
(goto-char (line-start (buffer-end)))
(let
((old-pos (cursor-pos)))
(backtrace debug-buffer)
(delete-area old-pos (next-line (1+ depth) (copy-pos old-pos)))
(split-line)))